<?php
/**
 * 后台用户登录相关接口
 * Created by PhpStorm.
 * User: LRChang
 * Date: 2018/6/5
 * Time: 9:53
 * Mail: hjklrchang@qq.com
 */

namespace app\adminapi\controller;

use app\adminapi\model\User;
use app\adminapi\validate\UserValidate;
use app\base\exception\BaseException;
use think\Config;
use think\Controller;
use think\Request;

/**
 * @name【2.用户登录退出管理】
 * @baseurl【Login】
 * @file【Login.php】
 */
class Login extends Controller {
    /**
     * @name【2.1用户名密码登录】
     * @desc【用户名密码登录】
     * @method【post】
     * @param【
     * username $ string $ admin $ 用户名 $ 1 #
     * password $ string $ xxxx $ 密码 $ 1 #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * user-token $ string $  $ user-token #
     * expires $ int $ $ token有效期 #
     * access $ array $ $ 操作权限
     * 】
     * @throws \app\base\exception\BaseException
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function login(){
        $params = ( new UserValidate())->scene('login_by_name')->goCheck()->getCurrentData();
        $session = (new User())->login($params['username'], $params['password']);
        return $this->retSucc(['data' => $session]);
    }

    /**
     ** @name【短信验证码登录】
     * @desc【短信验证码登录】
     * @uri【smsLogin】
     * @method【post】
     * @param【
     * mobile $ string $ xxxx $ 手机号 $ 1 #
     * code $ string $ 888888 $ 验证码 $ 1 #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * user-token $ string $  $ user-token #
     * expires $ int $ $ token有效期 #
     * access $ array $ $ 操作权限
     * 】
     * @throws BaseException
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function smsLogin(){
        $params = ( new UserValidate())->scene('login_by_sms')->goCheck()->getCurrentData();
        $session = (new User())->loginBySms($params['mobile'], $params['code']);
        return $this->retSucc(['data' => $session]);
    }

    /**
     * @name【获取手机登录验证码】
     * @desc【获取手机登录验证码】
     * @uri【getSms】
     * @method【post】
     * @param【
     * mobile $ string $ xxxx $ 手机号 $ 1 #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * 】
     * @return \think\response\Json
     * @throws BaseException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function getSms(){
        $params = ( new UserValidate())->scene('get_sms_code')->goCheck()->getCurrentData();
        // 发送短信验证码
        (new User())->sendSmsLoginCode($params['mobile']);

        return $this->retSucc();
    }

    /**
     * @name【退出登录】
     * @desc【退出登录】
     * @uri【logout】
     * @method【post】
     * @param【
     * user-token $ string $ c59d9b9ae1475d42c9f44bde41b68856 $ user-token，放置在请求头中 $ 1 #
     * 】
     * @return【
     * code $ int $ number|1-1 $ 标识1-成功 0-失败#
     * msg $ string $  $ code=0，错误信息#
     * 】
     * @return \think\response\Json
     * @throws BaseException
     */
    public function logout(){
        $userToken = $this->request->header('user-token');
        if(!$userToken){
            throw new BaseException('缺少user-token');
        }

        (new User())->logout($userToken);

        return $this->retSucc();
    }

    /**
     * 成功返回
     */
    public function retSucc($data=array(),$msg='ok',$code=1){
        $this->cos();
        $info['code'] = $code;
        $info['msg']  = $msg;
        $info['time'] = time();
        if(is_array($data)){
            $info         = array_merge($info,$data);
        }else{
            $info['data'] = $data;
        }
        return json($info);
    }

    /**
     * 失败返回
     */
    public function retError($msg='',$code=0){
        $this->cos();
        $info['code'] = $code;
        $info['msg']  = intval($msg)>99 ? $this->getErrorMsg($msg) : $msg;
        $info['time'] = time();
        return json($info);
    }

    public function cos(){
        header("Access-Control-Allow-Origin: * ");
        header("Access-Control-Allow-Methods: GET,HEAD,PUT,POST,DELETE,PATCH");
        header("Access-Control-Allow-Credentials: true");
        header("Access-Control-Allow-Headers: content-type");
        header("Access-Control-Max-Age: 2592000");
    }

    /**
     * 错误信息代码转换
     * @param int $code
     * @return string
     */
    public function getErrorMsg($code=100){
        Config::set(include  APP_PATH.'/../config/api/config.php','api');
        $errorArr = Config::get('api.error_msg');
        return isset($errorArr[$code]) ? $errorArr[$code] : $code;
    }
}